<?php defined('SYSPATH') or die('No direct script access.') ;
/**
 * 文章数据模型
 *
 * @author  Yellow.Chow <aultoale@gmail.com>
 * @version $Id: article.php 1 2014-01-13 15:05:51Z zhouyl $
 * @license http://www.gnu.org/licenses/gpl-3.0.html    GPL 3
 */
class Model_Article extends Model
{

    /**
     * 获取所有文章列表
     *
     * @return Database_Query_Builder_Select
     */
    public function all_sql()
    {
        return DB::select(
                'art.article_id', 'art.cat_id', 'art.title', 'art.author',
                'art.update_time', 'art.sort_order', 'art.clicks', 'art.is_show',
                array('cat.name', 'cat_name'), array('cat.path', 'cat_path'),
                'mem.nickname', 'mem.email'
            )
            ->from(array('articles', 'art'))
            ->join(array('article_categories', 'cat'), 'INNER')
            ->on('art.cat_id', '=', 'cat.cat_id')
            ->join(array('members', 'mem'), 'LEFT')
            ->on('mem.member_id', '=', 'art.author')
            ->where('cat.deleted', '=', 0);
    }

    /**
     * 获取文章信息
     *
     * @param  int  $article_id
     * @return array
     */
    public function get($article_id)
    {
        return DB::select()
            ->from('articles')
            ->where('article_id', '=', $article_id)
            ->fetch_row();
    }

    /**
     * 添加文章
     *
     * @param  array  $data
     * @return bool
     */
    public function add(array $data)
    {
        $v = $this->_validate($data);
        $this->validation($v);
        if ( ! $v->check() OR ! empty($this->_errors))
        {
            return FALSE;
        }

        $data = array(
            'cat_id' => $v->cat_id,
            'title' => $v->title,
            'content' => htmlspecialchars_decode($v->content),
            'author' => $this->auth->member_id,
            'post_time' => time(),
            'update_time' => time(),
            'sort_order' => (int) $v->sort_order,
            'is_show' => (bool) $v->is_show,
        );
        $result = DB::insert('articles', $data)->execute();

        return TRUE;
    }

    /**
     * 修改文章信息
     *
     * @param  int    $article_id
     * @param  array  $data
     * @return bool
     */
    public function edit($article_id, array $data)
    {
        $article = $this->get($article_id);
        if ( ! $article)
        {
            return $this->error('article_id', 'not_found');
        }

        $v = $this->_validate($data);
        $this->validation($v);

        if ( ! $v->check() OR ! empty($this->_errors))
        {
            return FALSE;
        }

        $data = array(
            'cat_id' => $v->cat_id,
            'title' => $v->title,
            'content' => htmlspecialchars_decode($v->content),
            'update_time' => time(),
            'sort_order' => (int) $v->sort_order,
            'is_show' => (bool) $v->is_show,
        );

        // 更新文章信息
        DB::update('articles', $data)
            ->where('article_id', '=', $article_id)
            ->execute();

        return TRUE;
    }

    /**
     * 删除文章
     *
     * @param  int  $article_id
     * @return bool
     */
    public function del($article_id)
    {
        // 删除属性数据
        DB::delete('articles')
            ->where('article_id', '=', $article_id)
            ->execute();

        return TRUE;
    }

    /**
     * 数据验证
     *
     * @param  array  $data
     * @return Validation
     */
    protected function _validate(array $data)
    {
        return Validation::factory($data)
            ->rule('cat_id', array($this, 'cat_exists'), array(':value'))
            ->rule('title', 'not_empty')
            ->rule('title', 'min_length', array(':value', 2))
            ->rule('title', 'max_length', array(':value', 100))
            ->rule('content', 'not_empty');
    }

    /**
     * 检查类目是否存在及叶子类目
     *
     * @param  int  $cat_id
     * @return bool
     */
    public function cat_exists($cat_id)
    {
        $category = Model::factory('article_category')->get($cat_id);

        if ( ! $category)
        {
            return $this->error('cat_id', 'not_found');
        }

        if ($category['is_parent'])
        {
            return $this->error('cat_id', 'is_parent_node');
        }

        return TRUE;
    }

}